package com.marketing.auth.service;

import com.marketing.auth.dto.*;
import com.marketing.auth.entity.Permission;
import com.marketing.auth.entity.Resource;
import com.marketing.auth.entity.Role;

import java.util.List;
import java.util.Set;

/**
 * RBAC权限管理服务接口
 */
public interface RbacService {

    // ============== 角色管理 ==============
    
    /**
     * 创建角色
     * @param role 角色信息
     * @param operator 操作者
     * @return 创建的角色
     */
    Role createRole(Role role, String operator);
    
    /**
     * 更新角色
     * @param role 角色信息
     * @param operator 操作者
     * @return 更新的角色
     */
    Role updateRole(Role role, String operator);
    
    /**
     * 删除角色
     * @param roleId 角色ID
     * @param operator 操作者
     * @return 是否删除成功
     */
    boolean deleteRole(Long roleId, String operator);
    
    /**
     * 根据ID获取角色
     * @param roleId 角色ID
     * @return 角色信息
     */
    Role getRoleById(Long roleId);
    
    /**
     * 查询所有角色
     * @return 角色列表
     */
    List<Role> getAllRoles();

    // ============== 资源管理 ==============
    
    /**
     * 创建资源
     * @param resource 资源信息
     * @param operator 操作者
     * @return 创建的资源
     */
    Resource createResource(Resource resource, String operator);
    
    /**
     * 更新资源
     * @param resource 资源信息
     * @param operator 操作者
     * @return 更新的资源
     */
    Resource updateResource(Resource resource, String operator);
    
    /**
     * 删除资源
     * @param resourceId 资源ID
     * @param operator 操作者
     * @return 是否删除成功
     */
    boolean deleteResource(Long resourceId, String operator);
    
    /**
     * 根据ID获取资源
     * @param resourceId 资源ID
     * @return 资源信息
     */
    Resource getResourceById(Long resourceId);
    
    /**
     * 查询所有资源
     * @return 资源列表
     */
    List<Resource> getAllResources();
    
    /**
     * 构建资源树
     * @return 资源树
     */
    List<ResourceDto> getResourceTree();

    // ============== 权限管理 ==============
    
    /**
     * 创建权限
     * @param permission 权限信息
     * @param operator 操作者
     * @return 创建的权限
     */
    Permission createPermission(Permission permission, String operator);
    
    /**
     * 更新权限
     * @param permission 权限信息
     * @param operator 操作者
     * @return 更新的权限
     */
    Permission updatePermission(Permission permission, String operator);
    
    /**
     * 删除权限
     * @param permissionId 权限ID
     * @param operator 操作者
     * @return 是否删除成功
     */
    boolean deletePermission(Long permissionId, String operator);
    
    /**
     * 根据ID获取权限
     * @param permissionId 权限ID
     * @return 权限信息
     */
    Permission getPermissionById(Long permissionId);
    
    /**
     * 查询所有权限
     * @return 权限列表
     */
    List<Permission> getAllPermissions();

    // ============== 权限分配 ==============
    
    /**
     * 为用户分配角色
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @param operator 操作者
     * @return 是否分配成功
     */
    boolean assignRolesToUser(Long userId, List<Long> roleIds, String operator);
    
    /**
     * 为角色分配权限
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @param operator 操作者
     * @return 是否分配成功
     */
    boolean assignPermissionsToRole(Long roleId, List<Long> permissionIds, String operator);

    // ============== 权限查询 ==============
    
    /**
     * 获取用户的所有角色
     * @param userId 用户ID
     * @return 角色列表
     */
    List<Role> getUserRoles(Long userId);
    
    /**
     * 获取用户的所有权限
     * @param userId 用户ID
     * @return 权限列表
     */
    List<Permission> getUserPermissions(Long userId);
    
    /**
     * 获取用户的所有权限编码
     * @param userId 用户ID
     * @return 权限编码集合
     */
    Set<String> getUserPermissionCodes(Long userId);
    
    /**
     * 获取用户可访问的菜单
     * @param userId 用户ID
     * @return 菜单资源树
     */
    List<ResourceDto> getUserMenus(Long userId);
    
    /**
     * 获取用户完整的权限信息
     * @param userId 用户ID
     * @return 用户权限信息
     */
    UserPermissionDto getUserPermissionInfo(Long userId);
    
    /**
     * 检查用户是否拥有指定权限
     * @param userId 用户ID
     * @param permissionCode 权限编码
     * @return 是否拥有权限
     */
    boolean hasPermission(Long userId, String permissionCode);
    
    /**
     * 检查用户是否拥有指定角色
     * @param userId 用户ID
     * @param roleCode 角色编码
     * @return 是否拥有角色
     */
    boolean hasRole(Long userId, String roleCode);
}